Módulo de Gestión de Alumnos y sus Interacciones
Fecha: 11 de junio de 2025 | Versión: 1.0 | Autor: Maestro Coder AI
Este documento proporciona un análisis técnico detallado del módulo de gestión de alumnos dentro del sistema OTEC. El informe abarca desde la creación y edición de un alumno, la gestión de sus archivos, su interacción con el sistema de cursos a través de las inscripciones, y el mecanismo de borrado lógico en cascada. El objetivo es ofrecer una guía completa para la comprensión, mantenimiento y replicación del módulo.
El módulo de alumnos es una entidad central en el sistema, con múltiples relaciones que definen su participación académica y administrativa.
[alumnos] 1--* [inscripciones_curso] *--1 [cursos_sence] | |--* [documentos_alumno] |--* [mensajes_alumno] '--* [mensajes_alumno_profesor] [inscripciones_curso] --* [notas_alumno] |--* [asistencias_alumno] '--* [pagos_alumno]
A continuación se detallan las tablas y campos más importantes que participan en la gestión de alumnos, extraído de estructura de tablas curso sence.txt
.
alumnos
Campo | Tipo | Propósito |
---|---|---|
id | int (PK) | Identificador único del alumno. |
rut | varchar(20) | RUT único del alumno, utilizado para validación. |
nombre , apellido_paterno , etc. | varchar/text/date | Datos personales básicos. |
foto_perfil | varchar(255) | Almacena la ruta relativa a la imagen de perfil en el servidor. |
estado | enum('activo','inactivo') | Pilar del borrado lógico. Controla la visibilidad y operatividad del alumno en el sistema. |
modo | enum(...) | Define el estatus académico del alumno (nuevo, regular, egresado, etc.). |
inscripciones_curso
Esta es la tabla de unión (junction table) que materializa la relación entre un alumno y un curso.
Campo | Tipo | Propósito |
---|---|---|
id | int (PK) | Identificador único de la inscripción. |
alumno_id | int (FK) | Vincula con la tabla alumnos . |
curso_id | int (FK) | Vincula con la tabla cursos_sence . |
fecha_inscripcion , valor_final , etc. | date/decimal | Datos administrativos y financieros de la inscripción. |
modo | enum(...) | Define el estado de avance de la inscripción (inscrito, en_curso, aprobado, etc.). |
estado | enum('activo','inactivo') | Permite el borrado lógico de una inscripción, conservando el historial pero ocultándola de las vistas activas. |
form_alumno.php
)Este script centraliza la creación y modificación de los datos de un alumno. El proceso es robusto y contempla validaciones, seguridad y gestión de archivos.
$_GET['alumno_id']
.normalizarRut()
y validarRutChileno()
para asegurar su formato y dígito verificador correctos.$mysqli->begin_transaction()
). Si alguna operación falla (ej., la actualización de la foto después de mover el archivo), se revierten todos los cambios con $mysqli->rollback()
para mantener la consistencia.prepare
, bind_param
, execute
) para todas las operaciones de inserción y actualización, previniendo eficazmente ataques de inyección SQL.unlink()
.alumnos.foto_perfil
.inscribir_alumno.php
)Este script formaliza la relación entre un alumno y un curso, creando un registro en la tabla `inscripciones_curso`.
cambiar_estado_alumno.php
)El sistema implementa un borrado lógico en cascada para mantener la integridad referencial y el historial de datos. Esta operación es gestionada por el script cambiar_estado_alumno.php
.
Cuando se desactiva un alumno, el script realiza las siguientes acciones dentro de una transacción:
notas_alumno.estado = 'inactivo'
para todas las notas asociadas a las inscripciones del alumno.asistencias_alumno.estado = 'inactivo'
.pagos_alumno.estado = 'inactivo'
.documentos_alumno.estado = 'inactivo'
.mensajes_alumno_profesor.estado = 'inactivo'
.acceso_alumnos_contenido.estado = 'bloqueado'
.inscripciones_curso.estado = 'inactivo'
para todas las inscripciones del alumno.mensajes_alumno.estado = 'inactivo'
.alumnos.estado = 'inactivo'
.La reactivación sigue una lógica similar, pero en orden inverso y con ciertas consideraciones:
alumnos.estado = 'activo'
.El módulo se compone de varios archivos que trabajan en conjunto. Asumiendo una estructura de directorios estándar, esta tabla describe sus roles e interacciones.
Script | Ubicación (Asumida) | Propósito Principal | Interactúa Con |
---|---|---|---|
listado_alumnos.php | / | Muestra la lista de todos los alumnos, con filtros y paginación. | form_alumno.php (Crear), ver_alumno.php (Ver), cambiar_estado_alumno.php (Activar/Desactivar). |
form_alumno.php | / | Formulario para crear un nuevo alumno o editar uno existente. | Se envía a sí mismo (POST), y al tener éxito redirige a listado_alumnos.php o se recarga en modo edición. |
ver_alumno.php | / | Muestra la ficha detallada de un alumno, incluyendo sus inscripciones. | inscribir_alumno.php , form_alumno.php . |
inscribir_alumno.php | / | Permite inscribir a un alumno específico en un curso disponible. | Se envía a sí mismo (POST) y al tener éxito redirige a ver_alumno.php . |
cambiar_estado_alumno.php | / | Script de backend (sin UI) que procesa la activación/desactivación en cascada. | Recibe la llamada desde listado_alumnos.php y redirige de vuelta al listado. |
alumnos_curso.php | / | Muestra la lista de alumnos inscritos en un curso específico. | Recibe el curso_id desde un listado de cursos. |
La gestión de archivos es un componente crítico para evitar la sobreescritura y mantener el orden. El sistema crea una estructura de directorios dinámica para cada alumno.
Al subir una foto para un alumno, el script form_alumno.php
construye dinámicamente una ruta basada en los datos del alumno. La función clave es sanitizar_nombre_para_directorio()
.
function sanitizar_nombre_para_directorio($nombre) {
if(empty($nombre)) return '';
$nombre_limpio = strtolower(trim($nombre));
$mapa_caracteres = [
'á'=>'a', 'é'=>'e', 'í'=>'i', 'ó'=>'o', 'ú'=>'u', 'ü'=>'u', 'ñ'=>'n',
'Á'=>'A', 'É'=>'E', 'Í'=>'I', 'Ó'=>'O', 'Ú'=>'U', 'Ü'=>'U', 'Ñ'=>'N',
'/'=>'_', ' '=>'_'
];
$nombre_limpio = strtr($nombre_limpio, $mapa_caracteres);
$nombre_limpio = preg_replace('/[^a-z0-9_]/', '', $nombre_limpio);
$nombre_limpio = preg_replace('/__+/', '_', $nombre_limpio);
return trim($nombre_limpio, '_');
}
La ruta completa se ensambla de la siguiente manera, garantizando un directorio único por alumno:
alumno/{ID}_{nombre_san}_{paterno_san}_{materno_san}/foto/
{ID}
: El ID único del alumno de la tabla alumnos
.{nombre_san}
, {paterno_san}
, {materno_san}
: Los nombres y apellidos procesados por la función de sanitización.Para evitar colisiones de nombres de archivo y problemas de caché en el navegador, los nombres de las fotos subidas se prefijan con un timestamp de Unix.
Ejemplo de nombre de archivo final: 1718134800_foto_perfil.jpg
La ruta completa guardada en la base de datos sería: alumno/123_juan_perez_gonzalez/foto/1718134800_foto_perfil.jpg